package com.idanchuang.component.pushgateway.test;

import com.idanchuang.component.pushgateway.Pusher;
import io.prometheus.client.Summary;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 *
 * Summary指标
 *
 * @author yjy
 * @date 2020/4/13 15:19
 **/
@Component
public class SummaryRunner implements CommandLineRunner {

    // Summary(摘要类型), Summary类型和Histogram类型相似，主要用于表示一段时间内数据采样结果（通常时请求持续时间或响应大小），它直接存储了quantile数据，而不是根据统计区间计算出来的。
    private final static Summary SAMPLE_SUMMARY = Summary.build()
            // 填写指标名称 (字母/数字/下划线)
            .name("sample_summary_index")
            // 设置自定义指标维度, 如: 应用, 实例, 响应码
            .labelNames("app", "http_code")
            // 指标说明
            .help("这里填写指标说明")
            // 设置分位点
            .quantile(0D, 0).quantile(0.1D, 0).quantile(0.2D, 0)
            .quantile(0.5D, 0).quantile(0.8D, 0).quantile(0.81D, 0)
            .create();

    @Autowired
    private Pusher pusher;

    @Override
    public void run(String... args) throws Exception {
        for (int i = 0; i < 10; i++) {
            // 多次上报样本指标
            pushSummary("test_app", "200", new Random().nextInt(100), "sample_job");
        }
    }

    /**
     * 上报 Summary 指标
     * @param app 应用
     * @param httpCode 状态码
     * @param value 值
     * @param job 工作组
     */
    private void pushSummary(String app, String httpCode, double value, String job) throws IOException {
        SAMPLE_SUMMARY.labels(app, httpCode).observe(value);
        // groupingKey: 如果应用为集群部署, 则必须指定应用实例信息, 否则某一个应用重启后, 会将整个集群的指标重置
        Map<String, String> groupingKey = new HashMap<>();
        groupingKey.put("instance", InetAddress.getLocalHost().getHostAddress());
        pusher.pushAdd(SAMPLE_SUMMARY, job, groupingKey);
    }

}
